/**
 * 通用工具函数
 *
 * @author AI Crawlers Team
 * @date 2025-10-10
 */

var utils = {
    
    /**
     * 格式化日期时间
     * @param {String|Date} date 日期
     * @param {String} format 格式（默认：YYYY-MM-DD HH:mm:ss）
     */
    formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
        if (!date) return '-';
        return dayjs(date).format(format);
    },
    
    /**
     * 显示加载动画
     * @param {String} message 提示消息
     */
    showLoading(message = '加载中...') {
        console.log('🔵 [showLoading] 显示Loading:', message);
        console.trace('🔍 [showLoading] 调用堆栈');
        Swal.fire({
            title: message,
            allowOutsideClick: false,
            allowEscapeKey: false,
            didOpen: () => {
                Swal.showLoading();
            }
        });
    },
    
    /**
     * 关闭加载动画
     */
    hideLoading() {
        console.log('🔴 [hideLoading] 关闭Loading');
        console.trace('🔍 [hideLoading] 调用堆栈');
        Swal.close();
    },
    
    /**
     * 成功提示
     * @param {String} message 提示消息
     */
    success(message) {
        toastr.success(message);
    },
    
    /**
     * 错误提示
     * @param {String} message 提示消息
     */
    error(message) {
        toastr.error(message);
    },
    
    /**
     * 警告提示
     * @param {String} message 提示消息
     */
    warning(message) {
        toastr.warning(message);
    },
    
    /**
     * 信息提示
     * @param {String} message 提示消息
     */
    info(message) {
        toastr.info(message);
    },
    
    /**
     * 确认对话框
     * @param {String} message 提示消息
     * @param {String} title 标题
     * @returns {Promise<Boolean>}
     */
    async confirm(message, title = '确认') {
        const result = await Swal.fire({
            title: title,
            text: message,
            icon: 'warning',
            showCancelButton: true,
            confirmButtonColor: '#3085d6',
            cancelButtonColor: '#d33',
            confirmButtonText: '确定',
            cancelButtonText: '取消'
        });
        return result.isConfirmed;
    },
    
    /**
     * 获取URL参数
     * @param {String} name 参数名
     */
    getQueryParam(name) {
        const params = new URLSearchParams(window.location.search);
        return params.get(name);
    },
    
    /**
     * 防抖函数
     * @param {Function} func 要执行的函数
     * @param {Number} wait 等待时间（毫秒）
     */
    debounce(func, wait = 300) {
        let timeout;
        return function(...args) {
            clearTimeout(timeout);
            timeout = setTimeout(() => func.apply(this, args), wait);
        };
    },
    
    /**
     * 节流函数
     * @param {Function} func 要执行的函数
     * @param {Number} wait 等待时间（毫秒）
     */
    throttle(func, wait = 300) {
        let timeout;
        return function(...args) {
            if (!timeout) {
                timeout = setTimeout(() => {
                    timeout = null;
                    func.apply(this, args);
                }, wait);
            }
        };
    },
    
    /**
     * 下载文件
     * @param {String} url 文件URL
     * @param {String} filename 文件名
     */
    downloadFile(url, filename) {
        const a = document.createElement('a');
        a.href = url;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
    },
    
    /**
     * 转义HTML
     * @param {String} str 要转义的字符串
     */
    escapeHtml(str) {
        if (!str) return '';
        const div = document.createElement('div');
        div.textContent = str;
        return div.innerHTML;
    },
    
    /**
     * 获取优先级样式
     * @param {String} priority 优先级值
     */
    getPriorityClass(priority) {
        const config = PRIORITIES.find(p => p.value === priority);
        return config ? config.class : 'secondary';
    },
    
    /**
     * 获取状态样式
     * @param {Number} status 状态值
     */
    getStatusClass(status) {
        return status === 1 ? 'success' : 'secondary';
    },
    
    /**
     * 获取状态文本
     * @param {Number} status 状态值
     */
    getStatusText(status) {
        return status === 1 ? '启用' : '禁用';
    },
    
    /**
     * 数组转逗号分隔字符串
     * @param {Array} arr 数组
     */
    arrayToString(arr) {
        if (!arr || !Array.isArray(arr)) return '';
        return arr.join(',');
    },
    
    /**
     * 逗号分隔字符串转数组
     * @param {String} str 字符串
     */
    stringToArray(str) {
        if (!str) return [];
        return str.split(',').map(s => s.trim()).filter(s => s);
    }
};

